package com.gcc.securityform.config;

import com.gcc.securityform.service.MyUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class SecunityConfig {

    @Autowired
    private MyUserDetailsService userDetailsService; // 注入我们自定义的用户服务

    // 定义一个密码编码器 Bean。Spring Security 会自动使用它来加密和验证密码。
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    // 定义安全过滤链，这是所有请求的“安全总管”。
    // 这里使用最新的lambda DSL风格配置。
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(authorize -> authorize
                        // 允许所有人访问主页、登录页面和注册接口
                        //.requestMatchers("/", "/register").permitAll()
                        .requestMatchers("/","/register","/admin/register").permitAll()
                        // 登录页面也必须对所有人放行，否则会陷入重定向循环
                        .requestMatchers("/login").permitAll()
                        // 其他所有请求都需要认证
                        .anyRequest().authenticated())
                // 【新增】在这里配置CSRF忽略规则
//                .csrf(csrf -> csrf.ignoringRequestMatchers(
//                        "/register"
//                ))
                // 忽略 /register 和 /admin/register 接口的 CSRF 保护
                .csrf(csrf -> csrf.ignoringRequestMatchers(
                        "/register",
                        "/admin/register"
                ))

                // 启用基于表单的登录。
                // Spring Security 会自动为你生成登录表单的处理逻辑。
                .formLogin(form -> form.loginPage("/login") // 指定自定义登录页面的 URL
                                .defaultSuccessUrl("/dashboard", true) // 登录成功后跳转的 URL
                                .permitAll()
                        // 允许所有用户访问登录页面
                ).logout(logout -> logout.permitAll());

        // Spring Boot 的自动配置会发现我们提供的 userDetailsService 和 passwordEncoder，
        // 并自动将它们用于认证过程。
        return http.build();
    }
}
